import ast

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.节点基础图形项 import 带布局的节点基础图形项

from 程序核心代码.ast节点.节点定义.基础定义.ast节点基础定义 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器


@注册节点模型(ast.JoinedStr)
class 格式化字符串ast节点基础模型(ast节点基础模型):

    def 节点数据解析(self):
        # 起始接口.常量值 = 起始接口._ast节点.value
        self.参数名称 = "值："
        # 起始接口.参数值 = 起始接口.常量值

    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "格式化字符串ast节点基础模型", 节点位置=节点位置, 上级节点=上级节点)

        self.源代码 = ast.unparse(self._ast节点)
        self.图形项 = 格式化字符串节点图形项( self)
        self.值列表 = []
        for ast节点 in self._ast节点.values:
            if isinstance(ast节点, ast.FormattedValue):
                """
                节点是以一个 f-字符串形式的格式化字段来代表的。 如果该字符串只包含单个格式化字段
                而没有任何其他内容则节点可以被隔离，否则它将在 JoinedStr 中出现。
                value 为任意的表达式节点（如一个字面值、变量或函数调用）。
                conversion 是一个整数:
                    -1: 无格式化
                    115: !s 字符串格式化
                    114: !r repr 格式化
                    97: !a ascii 格式化                   
                format_spec 是一个代表值的格式化的 JoinedStr 节点模型，或者如果未指定格式则为 None。 conversion 和 format_spec 可以被同时设置
                """
                self.值列表.append(节点模型匹配器(ast节点.value, self.所属节点模型管理器))
            else:
                self.值列表.append(节点模型匹配器(ast节点, self.所属节点模型管理器))

        # for 值 in 起始接口.值列表:
        #     值.添加接口到节点("数据流", "输出", 接口名称="数据输出", 必须连接=True)
        # 起始接口.添加接口到节点("数据流", "输出", 接口名称="数据输出", 必须连接=True)
        序列=0
        for 值 in self.值列表:
            起始接口 = 值.添加接口到节点("数据流", "输出", 接口名称="数据输出", 必须连接=True)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="位置 "+str(序列), 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)
            序列+=1


class 格式化字符串节点图形项(带布局的节点基础图形项):

    def __init__(self, 节点定义, 父项=None):
        super().__init__(节点定义, 父项)
        #起始接口.介绍文本.setPlainText(节点定义.源代码)
        self.节点定义.节点介绍 = self.节点定义.源代码
